package com.alibaba.cola.statemachine;

import java.util.Collection;
import java.util.List;

/**
 * State
 *
 * @param <S> the type of state
 * @param <E> the type of event
 * @param <C> the user defined context
 * @author Frank Zhang
 * @date 2020-02-07 2:12 PM
 * <p>
 * 状态
 */
public interface State<S, E, C> extends Visitable {

    /**
     * 获取状态id
     *
     * @return 状态id
     */
    S getId();

    /**
     * 状态添加流转
     *
     * @param event          触发转换器的事件
     * @param target         流转后的目标状态
     * @param transitionType 流转类型 {@link TransitionType}
     * @return 流转
     */
    Transition<S, E, C> addTransition(E event, State<S, E, C> target, TransitionType transitionType);

    /**
     * 状态添加并行流转，触发事件后，有多个目标状态，执行多个动作
     *
     * @param event          事件
     * @param targets        目标状态列表
     * @param transitionType 流转类型 {@link TransitionType}
     * @return 流转列表
     */
    List<Transition<S, E, C>> addTransitions(E event, List<State<S, E, C>> targets, TransitionType transitionType);

    /**
     * 获取状态的事件对应的转换列表
     *
     * @param event 事件
     * @return 转换列表
     */
    List<Transition<S, E, C>> getEventTransitions(E event);

    /**
     * 获取所有转换列表
     *
     * @return 状态中的所有转换列表
     */
    Collection<Transition<S, E, C>> getAllTransitions();

}
